package com.cuz.daileetcode.位运算;

/***
 * 不使用任何判断找到 两个数中较大的数
 */
public class FindMaxInTwoNum {

    /****
     * 获取符号位 如果为整数 or 0 返回 0
     * 反之返回-1
     * @param num 数
     * @return 符号位
     *      如果为整数 or 0 返回 0
     *       反之返回-1
     */
    private static int signBitOf(int num) {
        return num >> 31;
    }

    /**
     * 一个数 与上1
     * 如果这个数为0 那么返回0
     * 如果是-1 返回1
     *
     * @param num 一个数 与上1
     * @return 如果这个数为0 那么返回0
     * 如果是-1 or 1返回1
     */
    private static int andOne(int num) {
        return num & 1;
    }

    /***
     * 获取符号位 转变到0 和 1
     * @param num 一个数  执行 ((num>>31)&1)^1
     * @return 如果这个数是正数or 0 返回1 如果是负数返回0
     */
    private static int sign(int num) {
        return xorOne(andOne(signBitOf(num)));
    }

    /***
     * 一个数异或上1
     * @param num 数
     * @return 如果这个数 是0 那么返回0
     */
    private static int xorOne(int num) {
        return num ^ 1;
    }

    public static int maxMayOverFlow(int a, int b) {
        //a-b的差值 可能溢出
        int difference = a - b;
        //如果差值小于0 返回0 如果差值大于等于0 返回1
        int signOfDiff = sign(difference);
        //如果差值小于0 返回1 如果差值大于等于0 返回0
        int changeSignOfDiff = xorOne(signOfDiff);
        //如果 a>=b(差值大于0 signOfDiff=1) changeSignOfDiff 等于0 就返回a
        //如果 a<b(差值小于0 signOfDiff=0) changeSignOfDiff 等于1 就返回b
        return a * signOfDiff + b * changeSignOfDiff;
    }

    public static int max(int a, int b) {
        //a-b的差值 可能溢出
        int difference = a - b;
        //如果差值小于0 返回0 如果差值大于等于0 返回1
        int signOfDiff = sign(difference);
        //a>=0 signOfA=1 a<0 signOfA=0
        int signOfA = sign(a);
        //b>=0 signOfB=1 a<0 signOfB=0
        int signOfB = sign(b);
        //如果ab都是正数 or 负数 or 0 那么isSameSign=0 反之为1
        int isDiffSign = signOfA ^ signOfB;
        //如果ab都是正数 or 负数 or 0 那么isSameSign=1 反之为0
        int isSameSign = xorOne(isDiffSign);
        //什么情况返回a：
        //如果符号位不同 且 a>0 那么isDiffSign=1 signOfA=1 isDiffSign * signOfA =1
        //如果符号位相同 且 a>=b 那么 signOfDiff =1， isSameSign=1 ，isSameSign * signOfDiff =1
        int returnA = isDiffSign * signOfA + isSameSign * signOfDiff;
        //返回b的和返回a相反
        int returnB = xorOne(returnA);
        return returnA * a + returnB * b;
    }

    public static void main(String[] args) {
        System.out.println(max(-Integer.MAX_VALUE,1));
    }
}
